import os
import akshare as ak
import redis
from datetime import datetime

def init_finance_data():
    # akshare不需要设置token，但需要确保网络连接
    print("akshare初始化成功")
    
    # 初始化redis客户端（用于缓存数据）
    try:
        redis_client = redis.Redis(host='localhost', port=6379, decode_responses=True)
        # 测试连接
        redis_client.ping()
        return redis_client
    except Exception as e:
        print(f"Redis连接失败: {e}")
        return None

# 获取股票实时数据
def get_stock_data(stock_code, redis_client):
    # 尝试从缓存获取数据（有效期5分钟）
    cache_key = f'stock:{stock_code}'
    cached_data = redis_client.get(cache_key) if redis_client else None
    
    if cached_data:
        return eval(cached_data)
    
    # 缓存未命中，调用API获取数据
    try:
        # akshare使用的股票代码格式为'股票代码.市场'，例如'000001.SZ'
        # 获取股票实时行情
        df = ak.stock_zh_a_spot_em(symbol=stock_code)
        
        if df.empty:
            # 如果没有数据，尝试获取历史数据
            df = ak.stock_zh_a_daily(symbol=stock_code, adjust="qfq")
            if not df.empty:
                df = df.tail(1)
            else:
                return {}
        
        data = df.to_dict('records')[0] if not df.empty else {}
        
        # 缓存数据
        if redis_client:
            redis_client.setex(cache_key, 300, str(data))
        return data
    except Exception as e:
        print(f"获取股票数据失败: {e}")
        return {}

# 获取大盘指数数据
def get_index_data(index_code, redis_client):
    cache_key = f'index:{index_code}'
    cached_data = redis_client.get(cache_key) if redis_client else None
    
    if cached_data:
        return eval(cached_data)
    
    try:
        # 获取指数实时行情
        df = ak.index_zh_a_spot_em(symbol=index_code)
        
        if df.empty:
            # 如果没有数据，尝试获取历史数据
            df = ak.index_zh_a_daily(symbol=index_code, adjust="qfq")
            if not df.empty:
                df = df.tail(1)
            else:
                return {}
        
        data = df.to_dict('records')[0] if not df.empty else {}
        
        if redis_client:
            redis_client.setex(cache_key, 300, str(data))
        return data
    except Exception as e:
        print(f"获取指数数据失败: {e}")
        return {}